/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Servlets;

import Clases.Factura;
import Clases.LineaServicioFactura;
import Persistencia.PersistenciaFactura;
import Persistencia.PersistenciaLineaFactura;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.LineSeparator;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author JOEL ADMINISTRADOR
 */
public class CrearPDF extends HttpServlet {
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, DocumentException, SQLException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        String clase = request.getParameter("id");
        
        
        if(clase.equals("Factura"))
        {
            
        String cod = (String) request.getParameter("codigo");
        String destino = getServletContext().getRealPath("/documentos/factura")+cod+".pdf";
        //me lo guardará en la carpeta build
        
        //creo el documento
    	Document document = new Document();
        // obtengo una instancia especificando el destino del pdf
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(destino));
        // abro el documento
    	document.open(); 
        
        Factura factura = PersistenciaFactura.obtenerFactura(cod);
        String serie = factura.getSerieFacturacion().getSerie();
        String cliente = factura.getFacturacionCliente().getCliente().getNombre();
        String cif = factura.getFacturacionCliente().getNif();
        String porcentajeiva = String.valueOf(factura.getTipoIva().getPorcentaje());
        String porcentajeretencion = String.valueOf(factura.getRetencion());        
        
        
	Image foto = Image.getInstance(getServletContext().getRealPath("/img/logo.jpg"));
	foto.scaleToFit(100, 100);
	foto.setAlignment(Chunk.ALIGN_LEFT);
        document.add(foto);
        
        
        Font font1 = new Font(Font.FontFamily.HELVETICA, 8, Font.NORMAL, BaseColor.LIGHT_GRAY);  
        
        Phrase titulo = new Phrase("Gestión Clamajirand");
        Phrase jose = new Phrase("José Clamajirand Valdivia",font1);
        Phrase email = new Phrase("Email: formacion@clamajirand.com",font1);
        Phrase codigofactura = new Phrase();
        Phrase nombrecliente = new Phrase();
        Phrase dnicif = new Phrase();
        Phrase direccion = new Phrase();
        Phrase localidad = new Phrase();
        Phrase cp = new Phrase();
        Phrase fecha = new Phrase();
        Phrase iva = new Phrase();  
        Phrase retencion = new Phrase();    
        Phrase linea1tabla = new Phrase();
        
        

        
        LineSeparator line = new LineSeparator(1, 100, BaseColor.BLUE, Element.ALIGN_CENTER, -42); 
        PdfContentByte canvas = writer.getDirectContentUnder();
        
        Paragraph p = new Paragraph();  
        ColumnText.showTextAligned(canvas, Element.ALIGN_RIGHT,titulo, 555,800,0);
        ColumnText.showTextAligned(canvas, Element.ALIGN_RIGHT, jose, 555, 790, 0);
        ColumnText.showTextAligned(canvas, Element.ALIGN_RIGHT, email, 555, 780, 0);        
       

        
        
        Font font = new Font(Font.FontFamily.HELVETICA, 8, Font.BOLD, BaseColor.WHITE);        
        Font font2 = new Font(Font.FontFamily.HELVETICA, 10, Font.NORMAL, BaseColor.BLACK);
          
        //creo los chunks y los añado a la phrase, xq sólo la phrase puede posicionarse,
        //los chunks no.
        Chunk codF = new Chunk("FACTURA:  ", font2);          
        Chunk codigoyserie = new Chunk(serie+"   "+cod,font);
        codigoyserie.setHorizontalScaling(2);
        codigoyserie.setTextRise(2);
        codigoyserie.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f);  
        codigofactura.add(codF);
        codigofactura.add(codigoyserie);
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,codigofactura, 35,692,0);         
        
        p.add(line);         
        
        Chunk nombrec = new Chunk("Cliente:            ", font2);
        Chunk nombrecvalor = new Chunk(cliente,font);
        nombrecvalor.setHorizontalScaling(2);
        nombrecvalor.setTextRise(2);
        nombrecvalor.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f); 
        nombrecliente.add(nombrec);
        nombrecliente.add(nombrecvalor);
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,nombrecliente, 35,600,0);  
        
        Chunk dnicifc = new Chunk("DNI/CIF:          ", font2);
        Chunk dnicifcvalor = new Chunk(factura.getFacturacionCliente().getCliente().getNif(),font);
        dnicifcvalor.setHorizontalScaling(2);
        dnicifcvalor.setTextRise(2);
        dnicifcvalor.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f); 
        dnicif.add(dnicifc);
        dnicif.add(dnicifcvalor);
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,dnicif, 35,570,0);  
        
        Chunk direccionc = new Chunk("Dirección:        ", font2);
        Chunk direccioncvalor = new Chunk(factura.getFacturacionCliente().getCliente().getDireccion(),font);
        direccioncvalor.setHorizontalScaling(2);
        direccioncvalor.setTextRise(2);
        direccioncvalor.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f); 
        direccion.add(direccionc);
        direccion.add(direccioncvalor);
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,direccion, 35,480,0);          
        
        Chunk localidadc = new Chunk("Localidad:        ", font2);
        Chunk localidadcvalor = new Chunk(factura.getFacturacionCliente().getCliente().getLocalidad(),font);
        localidadcvalor.setHorizontalScaling(2);
        localidadcvalor.setTextRise(2);
        localidadcvalor.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f); 
        localidad.add(localidadc);
        localidad.add(localidadcvalor);
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,localidad, 35,510,0);   
        
        Chunk cpc = new Chunk("CP:                  ", font2);
        Chunk cpcvalor = new Chunk(factura.getFacturacionCliente().getCliente().getCodigoPostal(),font);
        cpcvalor.setHorizontalScaling(2);
        cpcvalor.setTextRise(2);
        cpcvalor.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f); 
        cp.add(cpc);
        cp.add(cpcvalor);
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,cp, 35,540,0);          
        
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        String fechaa = df.format(factura.getFecha());
        Chunk fechac = new Chunk("Fecha:            ", font2);
        Chunk fechacvalor = new Chunk(fechaa,font);
        fechacvalor.setHorizontalScaling(2);
        fechacvalor.setTextRise(2);
        fechacvalor.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f); 
        fecha.add(fechac);
        fecha.add(fechacvalor);
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,fecha, 350,600,0);     
        
        Chunk ivac = new Chunk("IVA:                ", font2);
        Chunk ivacvalor = new Chunk(porcentajeiva+"%",font);
        ivacvalor.setHorizontalScaling(2);
        ivacvalor.setTextRise(2);
        ivacvalor.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f); 
        iva.add(ivac);
        iva.add(ivacvalor);
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,iva, 350,570,0); 
        
        Chunk retencionc = new Chunk("Retención:      ", font2);
        Chunk retencioncvalor = new Chunk(porcentajeretencion+"%",font);
        retencioncvalor.setHorizontalScaling(2);
        retencioncvalor.setTextRise(2);
        retencioncvalor.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f); 
        retencion.add(retencionc);
        retencion.add(retencioncvalor);
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,retencion, 350,540,0);         
        
        

        document.add(p);
        
        //CREAR UNA TABLA DONDE APAREZCAN TODAS LAS LÍNEAS DE FACTURA
        PdfPTable tabla = new PdfPTable(4);
        tabla.setWidthPercentage(100);
        ArrayList<LineaServicioFactura> lineas = PersistenciaLineaFactura.obtenerLineas(cod);
        Chunk linea1 = new Chunk("Concepto                    Unidades              Precio                    Total Línea",font);
        linea1.setBackground(BaseColor.BLUE, 1f, 3f, 1f, 3f);
        linea1.setHorizontalScaling(2); 
        linea1tabla.add(linea1);
        ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,linea1tabla, 37,390,0);         
        

        for (LineaServicioFactura linea:lineas)
        {
	tabla.addCell(linea.getServicio().getNombre());
        tabla.addCell(String.valueOf(linea.getCantidad()));
        tabla.addCell(String.valueOf(linea.getPrecioUnidad()));
        tabla.addCell(String.valueOf(linea.getTotalLinea()));
        }
         
    
        

        Paragraph p4 = new Paragraph();
        p4.setSpacingBefore(350);
        //325
        Phrase t = new Phrase();
        Chunk totalf = new Chunk("Total: "+factura.getTotalFactura(),new Font(Font.FontFamily.HELVETICA, 10, Font.BOLD, BaseColor.BLACK));
        totalf.setBackground(BaseColor.LIGHT_GRAY, 1f, 1f, 1f, 1f);
        totalf.setHorizontalScaling(2); 
        t.add(totalf);   
        //ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,t, 420,50,0);          


        Phrase ph = new Phrase(" ");
        //Phrase ph2 = new Phrase("Total: "+totalf);
        PdfPCell cell = new PdfPCell(ph); 
        PdfPCell cell2 = new PdfPCell(t);
        cell2.setBackgroundColor(BaseColor.LIGHT_GRAY);
        cell.setBorder(0);
        cell2.setBorder(0);
        tabla.addCell(cell);
        tabla.addCell(cell);
        tabla.addCell(cell); 
        tabla.addCell(cell2);            
        

        p4.add(tabla);
        document.add(p4); 
        document.close();

               
        request.setAttribute("insertado",5);
        RequestDispatcher rd = request.getRequestDispatcher("SVer?id=Facturas");
        rd.forward(request, response);
        
        
        }
        try {
        } finally {            
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            try {
                processRequest(request, response);
            } catch (SQLException ex) {
                Logger.getLogger(CrearPDF.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (DocumentException ex) {
            Logger.getLogger(CrearPDF.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            try {
                processRequest(request, response);
            } catch (SQLException ex) {
                Logger.getLogger(CrearPDF.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (DocumentException ex) {
            Logger.getLogger(CrearPDF.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}

